/**
 * 解决LeetCode 203题
 * 使用Head
 * 要解决第一个节点的特殊处理，因为初始化head=null
 */
public class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //如果从该链表的第一个元素就是要被删除的
        while(head != null && head.val == val){
            //head往后移动
//            ListNode delNode = head;
//            head = head.next;
//            delNode.next = null; //让java的垃圾回收可以回收

            //如果不考虑java的垃圾回收
            head = head .next;

            //可以把从第一个就是需要被删的开始连续的等于val的删掉
        }
        //如果从头到尾都是需要删除的节点，那么整个链表已经空了，直接返回null 这里null==head
        if(head == null)
            return head;


        //从第一个元素开始连续的需要删除的已经删除完成，但链表中间可能有需要删除的
        //删除思路，找到需要删除的节点的前一个节点

        ListNode prev = head;   //这个节点肯定不是需要被删除的
        while(prev.next!=null){
            if(prev.next.val==val){ //需要删除
                //head往后移动
//                ListNode delNode = prev.next;
//                prev.next = delNode.next;
//                delNode.next = null;  //让java的垃圾回收可以回收

                //如果不考虑垃圾回收可以直接简写为
                prev.next=prev.next.next;
            }else{
                //不需要删除就移动到下一个节点
                prev = prev.next;
            }
        }

        return head;
    }

    //测试自己的Solution类
    public static void main(String[] args) {

        int[] nums = {1, 2, 6, 3, 4, 5, 6};
        ListNode head = new ListNode(nums);
        System.out.println(head);

        ListNode res = (new Solution()).removeElements(head, 6);
        System.out.println(res);
    }
}
